package com.sisgesbyte.dao.rrhh;

import java.util.List;

import javax.ejb.Stateless;
import javax.inject.Inject;
import javax.persistence.EntityManager;
import javax.persistence.PersistenceContext;
import javax.persistence.Query;

import com.sisgesbyte.common.ConstModAdministracion;
import com.sisgesbyte.common.ConstantesInternasSistema;
import com.sisgesbyte.dao.beanDao.EmpleadoRequest;
import com.sisgesbyte.dao.beanDao.FiltrosSQLBean;
import com.sisgesbyte.dao.utilDao.CreaFiltroSqlString;
import com.sisgesbyte.data.entity.rrhh.EmpleadoEntity;
import com.sisgesbyte.data.entity.rrhh.ListaEmpleadoEntity;
import com.sisgesbyte.data.util.AbstractFacade;
import com.sisgesbyte.services.commonBean.GenericResponse;

@Stateless
public class MantenimientoEmpleadoDaoImpl extends
		AbstractFacade<ListaEmpleadoEntity> implements MantenimientoEmpleadoDao {

	@Inject
	private CreaFiltroSqlString creaFiltroSqlString;

	@PersistenceContext(unitName = "SigesSiscompPU")
	private EntityManager em;

	@Override
	protected EntityManager getEntityManager() {
		return em;
	}

	public MantenimientoEmpleadoDaoImpl() {
		super(ListaEmpleadoEntity.class);
	}

	@Override
	public List<ListaEmpleadoEntity> listaEmpleados(FiltrosSQLBean cadenaFiltros)  {
		List<ListaEmpleadoEntity> ls = null;

			StringBuilder jpql = new StringBuilder();
			jpql.append("SELECT e.id, co.id id_comun_objeto, ae.id id_area_empresa, ae.nombre area_empresa,ce.id id_categoria_empleado,ce.categoria categoria_empleado, ");
			jpql.append("e.cod_empleado,co.tipo_identificacion_id,ti.descripcion tipo_identificacion,co.num_doc,co.nombre,co.apellido,co.apellido_materno,co.telefono1,  ");
			jpql.append("co.telefono2,co.email,co.fecha_nacimiento,p.id id_pais,p.nombre pais,dp.id id_region,dp.nombre region, ");
			jpql.append("c.id id_ciudad, c.nombre ciudad, d.id id_distrito, d.nombre distrito,co.direccion ,e.imagen,co.fecha_registro,e.estado  ");
			jpql.append("FROM rrhh.empleado e inner join comun.comun_objeto co on e.comun_objeto_id=co.id ");
			jpql.append("left join rrhh.categoria_empleado ce on e.categoria_empleado_id=ce.id ");
			jpql.append("left join comun.areas_empresa ae on e.area_empresa_id=ae.id ");
			jpql.append("inner join sistema.empresa em on e.empresa_id=em.id ");
			jpql.append("inner join comun.tipo_identificacion ti on co.tipo_identificacion_id=ti.id  ");
			jpql.append("left join localizacion.pais p on co.pais_id=p.id ");
			jpql.append("left join localizacion.division_pais dp on co.division_pais_id = dp.id ");
			jpql.append("left join localizacion.ciudad c on co.ciudad_id=c.id ");
			jpql.append("left join localizacion.distrito d on co.distrito_id = d.id ");

			// concatenamos el filtro
			if (cadenaFiltros != null) {
				StringBuilder filtro = new StringBuilder();
				filtro.append(creaFiltroSqlString.concatenar(cadenaFiltros));
				jpql.append(filtro.toString());
			}

			Query query = em.createNativeQuery(jpql.toString(),
					ListaEmpleadoEntity.class);

			if (cadenaFiltros != null
					&& cadenaFiltros.getListaValores() != null
					&& cadenaFiltros.getListaValores().size() > 0) {
				int num = 0;
				for (Object valor : cadenaFiltros.getListaValores()) {
					query.setParameter(++num, valor);
				}
			}
			ls = query.getResultList();

		return ls;
	}

	@Override
	public GenericResponse nuevoEmpleado(EmpleadoRequest request) {
		
		GenericResponse response = new GenericResponse();
		
		try{
			EmpleadoEntity empleado = new EmpleadoEntity();
			empleado.setArea_empresa_id(request.getId_area_empresa());
			empleado.setCod_empleado(request.getCod_empleado());
			empleado.setComun_objeto_id(request.getId_comun_objeto());
			empleado.setEmpresa_id(request.getId_empresa());
			empleado.setEstado(request.getEstado());
			empleado.setImagen(request.getImagen());
			em.persist(empleado);
			em.flush();
			
			response.setCodigoRespuesta(ConstantesInternasSistema.CODIGO_EXITO);
			response.setMensajeRespuesta(ConstantesInternasSistema.MENSAJE_EXITO);
		}catch(Exception e){
			response.setCodigoRespuesta(ConstModAdministracion.MANT_NUEVO_COD_IDT);
			response.setMensajeRespuesta(e.toString());
		}
		
		return response;
	}

}
